#include <stdio.h>
#include <stdlib.h>
// 指针与变量
void pointer1()
{
    int a = 10;
    int *p = &a;
    printf("%d\n", *p); // 输出10
    printf("%p\n", p);  // 输出10
}
// 一维指针和数组
void pointer2()
{
    int num[5] = {11, 22, 33, 44, 55};
    int *p = num;
    for (; p < num + 5; p++)
    {
        printf("*p=%d\n", *p);
    }
    p = num;
    printf("%d,%d,%d\n", *p++, (*p)++, ++(*p));
}

// void pointer_2(void)
// {
//     printf("指针数组与数组指针\n");
//     int num[4][5]={0};
//     int *p_num[4];//可以指向4个int类型的地址
//     int (*q_num)[5];//可以指向一个含5个元素的一维数组
//     //通过指针数组来访问二维数组
//     for(int i=0;i<4;i++)
//     p_num[i]=num[i];//p_num[i]指向了  &num[i][0];
// //通过指针数组来对二维数组的每一个元素进行赋值
//     for(int i=0;i<4;i++)
//     {
//         for(int j=0;j<5;j++)
//         {
//             *(*(p_num+i)+j)=101+i*5+j;
//         }
//     }
//     //通过下标法遍历打印数组元素值
//     for(int i=0;i<4;i++)
//     {
//         for(int j=0;j<5;j++)
//         {
//            printf("%d\t",num[i][j]);
//         }
//         printf("\n");
//     }
//     printf("------\n");
//     //通过数组指针 来访问输出  数组元素的值
//     q_num=num;
//     for(int i=0;i<4;i++)//q_num指向下一行
//     {
//         for(int j=0;j<5;j++)
//         {
//            printf("%d\t",*(*(q_num+i)+j));
//         }
//          printf("\n");
//     }

// }
void pointer6()
{
    char test = '6';
    char str[6] = {"demo"};
    char *p = str;
    puts(p);
    *p = 'a';
    *(p + 1) = '9';
    puts(p);
    // p = &test;
    // puts(p);
    // p = 'pass'; // 这样赋值编译过不了，只能以取地址&的方式赋值
    printf("%c,%c\n", "demo"[1], p[1]);
    *p = 'a';
    puts(p);
    char buf[20] = {"poss"};
    // buf = "okk"; // 语法编译过不了
}
void pointer7()
{
    char *p[] = {"1", "2"};
    for (int i = 0; i < 2; i++)
    {
        puts(p[i]);
    }
}

void demo1(char name)
{
    printf("%c\n", name);
}
// 回调函数
void pointer8(char name, void (*p)(char))
{
    p(name);
}

// // 主函数参数

// int main(int argc, char *argv[])
// {
//     int a = atoi(argv[1]);
//     int b = atoi(argv[3]);
//     // 处理运算符
//     switch (*argv[2]) {
//     case '+':
//         printf("%d\n", a + b);
//         break;
//     case '-':
//         printf("%d\n", a - b);
//         break;
//     case '*':
//         printf("%d\n", a * b);
//         break;
//     case '/':
//         printf("%d\n", a / b);
//         break;
//     default:
//         return 1;
//     }
//     return 0;
// }

// 万能指针
int main()
{
    void *p = NULL;
    int a = 10;
    char ch = 'a';
    p = (void *)&a;
    *(int *)p = 20;
    printf("a=%d\n", a);
    p = (void *)&ch;
    printf("*p=%c\n", *(char *)p);
    return 0;
}